package br.com.foxinline.manager.criar;

import br.com.foxinline.enums.Sexo;
import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.*;
import br.com.foxinline.utilitario.Msg;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.context.RequestContext;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerCriarCadastroIndividual implements Serializable {

    @EJB
    CadastroIndividualServico cadastroIndividualServico;
    @EJB
    CidadaoServico cidadaoServico;
    @EJB
    TipoDeficienciaServico tipoDeficienciaServico;
    @EJB
    ProfissionalServico profissionalServico;
    @EJB
    EnderecoServico enderecoServico;
    @EJB
    VacinaServico vacinaServico;
    @EJB
    CidadeServico cidadeServico;
    @EJB
    MicroAreaServico microAreaServico;
    @EJB
    UsuarioServico usuarioServico;
    @EJB
    QuestionarioAutoReferidoServico questionarioAutoReferidoServico;
    private CadastroIndividual cadastro;
    private QuestionarioAutoReferido questionario;
    private Cidadao cidadao;
    private Cidadao responsavel;
    private Cidadao responsavelPesquisar;
    private List<Cidadao> responsaveis;
    private Cidade cidade;
    private String condicaoSaude;
    private String pratica;
    private Vacina vacina;
    private Profissional profissionalCadastrar;
    private Profissional profissionalPesquisar;
    private List<Profissional> profissionaisPesquisar;
    private boolean mensagemEndereco;

    @PostConstruct
    public void init() {

        questionario = new QuestionarioAutoReferido();
        questionario.setCriancaVacinasAtrasadas(new ArrayList<Vacina>());

        cadastro = new CadastroIndividual();
        cadastro.setCartaoResponsavelFamiliar(new Cidadao());
        iniciarProfissional();
        iniciarResponsavelFamiliar();

        cidadao = new Cidadao();
        responsavel = new Cidadao();
        responsavelPesquisar = new Cidadao();

        cidade = new Cidade();

        condicaoSaude = "";

        vacina = new Vacina();

        pratica = "";
        condicaoSaude = "";

        profissionalCadastrar = new Profissional();
        profissionalCadastrar.setEndereco(new Endereco());
        profissionalPesquisar = new Profissional();
        profissionaisPesquisar = new ArrayList<Profissional>();

        mensagemEndereco = false;
    }

    public Cidadao getResponsavelPesquisar() {
        return responsavelPesquisar;
    }

    public void setResponsavelPesquisar(Cidadao responsavelPesquisar) {
        this.responsavelPesquisar = responsavelPesquisar;
    }

    public List<Cidadao> getResponsaveis() {
        return responsaveis;
    }

    public void setResponsaveis(List<Cidadao> responsaveis) {
        this.responsaveis = responsaveis;
    }

    public Profissional getProfissionalCadastrar() {
        return profissionalCadastrar;
    }

    public void setProfissionalCadastrar(Profissional profissionalCadastrar) {
        this.profissionalCadastrar = profissionalCadastrar;
    }

    public Profissional getProfissionalPesquisar() {
        return profissionalPesquisar;
    }

    public void setProfissionalPesquisar(Profissional profissionalPesquisar) {
        this.profissionalPesquisar = profissionalPesquisar;
    }

    public List<Profissional> getProfissionaisPesquisar() {
        return profissionaisPesquisar;
    }

    public void setProfissionaisPesquisar(List<Profissional> profissionaisPesquisar) {
        this.profissionaisPesquisar = profissionaisPesquisar;
    }

    public CadastroIndividual getCadastro() {
        return cadastro;
    }

    public void setCadastro(CadastroIndividual cadastro) {
        this.cadastro = cadastro;
    }

    public QuestionarioAutoReferido getQuestionario() {
        return questionario;
    }

    public void setQuestionario(QuestionarioAutoReferido questionario) {
        this.questionario = questionario;
    }

    public Cidadao getCidadao() {
        return cidadao;
    }

    public void setCidadao(Cidadao cidadao) {
        this.cidadao = cidadao;
    }

    public Cidadao getResponsavel() {
        return responsavel;
    }

    public void setResponsavel(Cidadao responsavel) {
        this.responsavel = responsavel;
    }

    public Cidade getCidade() {
        return cidade;
    }

    public void setCidade(Cidade cidade) {
        this.cidade = cidade;
    }

    public String getCondicaoSaude() {
        return condicaoSaude;
    }

    public void setCondicaoSaude(String condicaoSaude) {
        this.condicaoSaude = condicaoSaude;
    }

    public String getPratica() {
        return pratica;
    }

    public void setPratica(String pratica) {
        this.pratica = pratica;
    }

    public Vacina getVacina() {
        return vacina;
    }

    public void setVacina(Vacina vacina) {
        this.vacina = vacina;
    }

    public boolean isMensagemEndereco() {
        return mensagemEndereco;
    }

    public void setMensagemEndereco(boolean mensagemEndereco) {
        this.mensagemEndereco = mensagemEndereco;
    }

    /**
     *
     */
    public void salvar() {
        try {
            if (verificarCadastro()) {

                cadastro.setDigitadoPor(usuarioServico.getCurrentUser());
                cadastro.setDataDigitado(new Date());
                cadastro.setAtual(true);

                questionarioAutoReferidoServico.salvar(questionario);
                cadastro.setQuestionarioAutoReferido(questionario);

                cidadaoServico.salvar(cidadao);
                cadastro.setCidadao(cidadao);

                cadastroIndividualServico.salvar(cadastro);
                Msg.messagemInfo(Msg.SuccessFull);
                init();
            }
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void existeResponsavel() {
        cadastro.setCartaoResponsavelFamiliar(cidadaoServico.existe(cadastro.getCartaoResponsavelFamiliar()));
    }

    public List<TipoDeficiencia> autocompleteTipoDeficiencia(String query) {
        return tipoDeficienciaServico.autoComplete(query);
    }

    public List<Cidade> autocompleteCidade(String query) {
        return cidadeServico.autocomplete(query);
    }

    public List<Vacina> autocompleteVacina(String query) {
        return vacinaServico.autocomplete(query, questionario.getCriancaVacinasAtrasadas());
    }

    public List<MicroArea> autocompleteMicroArea(String query) {
        return microAreaServico.autocomplete(query);
    }

    public void pesquisarResponsavel() {
        responsaveis = cidadaoServico.pesquisarTodos(responsavelPesquisar);
    }

    public void removerResponsavel() {
        iniciarResponsavelFamiliar();
    }

    public void selecionarResponsavel(Cidadao cidadao) {
        cadastro.setCartaoResponsavelFamiliar(cidadao);
        limparResponsavelDialog();
    }

    public void pesquisarProfissional() {
        profissionaisPesquisar = profissionalServico.findProfissional(profissionalPesquisar);
    }

    public void removerProfissional() {
        iniciarProfissional();
    }

    public void selecionarProfissional(Profissional profissional) {
        cadastro.setProfissional(profissional);
        limparProfissionalDialog();
    }

    public void salvarProfissional() {
        try {
            profissionalServico.salvar(profissionalCadastrar);
            Msg.messagemInfo(Msg.SuccessFull);
            cadastro.setProfissional(profissionalCadastrar);

            RequestContext.getCurrentInstance().execute("dialogProfissional.hide()");

        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void editarPratica(String a) {
        questionario.getOutrasPraticasIntegrativasNome().remove(a);
        pratica = a;
    }

    public void removerPratica(String a) {
        questionario.getOutrasPraticasIntegrativasNome().remove(a);
    }

    public void adicionarPratica() {
        questionario.getOutrasPraticasIntegrativasNome().add(pratica);
        pratica = "";
    }

    public void editarCondicao(String condicao) {
        questionario.getOutrasCondicoesSaude().remove(condicao);
        condicaoSaude = condicao;
    }

    public void removerCondicao(String condicao) {
        questionario.getOutrasCondicoesSaude().remove(condicao);
    }

    public void adicionarCondicao() {
        questionario.getOutrasCondicoesSaude().add(condicaoSaude);
        condicaoSaude = "";
    }

    public void adicionarVacina() {
        if (vacina.getId() != null) {
            questionario.getCriancaVacinasAtrasadas().add(vacina);
            vacina = new Vacina();
        }
    }

    public void removerVacina(Vacina vacina) {
        questionario.getCriancaVacinasAtrasadas().remove(vacina);
    }

    public String peso(double peso) {

        int integer = (int) peso;
        double decimal = (10 * peso - 10 * integer) / 10;

        return integer + " quilo(s) e " + String.format("%3.0f", decimal * 1000) + " gramas";
    }

    public String altura(double altura) {

        int integer = (int) altura;
        double decimal = (10 * altura - 10 * integer) / 10;

        return integer + " m e " + String.format("%3.0f", decimal * 1000) + " cm";
    }

    public void existeEndereco() {

        Endereco endereco = enderecoServico.existCep(profissionalCadastrar.getEndereco());

        if (endereco != null) {
            profissionalCadastrar.setEndereco(endereco);
            mensagemEndereco = false;
        } else {
            String cep = profissionalCadastrar.getEndereco().getCep();
            profissionalCadastrar.setEndereco(new Endereco());
            profissionalCadastrar.getEndereco().setCep(cep);

            mensagemEndereco = true;
        }
    }

    private boolean verificarCadastro() {
        if (cadastro.getProfissional().getId() == null) {
            Msg.messagemError("Profissional é obrigatório");
            RequestContext.getCurrentInstance().execute("requiredProfissional(true)");
            return false;
        }

        if (cidadao.getSexo().equals(Sexo.MASCULINO)) {
            questionario.setGestante(null);
            questionario.setPuerperio(null);
            questionario.setPccu(null);
        }

        if (cadastro.getResponsavelFamiliar() != null && cadastro.getResponsavelFamiliar() == false) {
            cadastro.setCartaoResponsavelFamiliar(null);
        }

        if (cadastro.getMembroComunidade() != null && cadastro.getMembroComunidade() == false) {
            cadastro.setNomeComunidade(null);
        }

        if (cadastro.getInformarOrientacaoSexual() != null && cadastro.getInformarOrientacaoSexual() == false) {
            cadastro.setOrientacaoSexual(null);
        }

        if (cadastro.getPossuiDeficiencia() != null && cadastro.getPossuiDeficiencia() == false) {
            cadastro.setTipoDeficiencia(null);
        }

        if (cadastro.getSituacaoDeRua() != null && cadastro.getSituacaoDeRua() == false) {
            cadastro.setTempoSituacaoRua(null);
        }

        if (cadastro.getAcompanhadoOutraInstituicao() != null && cadastro.getAcompanhadoOutraInstituicao() == false) {
            cadastro.setNomeOutraInstituicao(null);
        }

        if (cadastro.getFrequentaFamiliarFrequencia() != null && cadastro.getFrequentaFamiliarFrequencia() == false) {
            cadastro.setGrauParentesco(null);
        }

        if (cadastro.getFrequentaEscola() != null && cadastro.getFrequentaEscola() == false) {
            cadastro.setTipoCurso(null);
        }

        if (cadastro.getResponsavelFamiliar() != null && cadastro.getResponsavelFamiliar() == true) {
            cadastro.setCartaoResponsavelFamiliar(null);
        }

        if (questionario.getGestante() != null && questionario.getGestante() == false) {
            questionario.setGestanteDUM(null);
            questionario.setGestanteDPP(null);
            questionario.setGestanteExamesEmDia(null);
            questionario.setGestanteQualTrimestre(null);
            questionario.setGestanteAcompanhamentoPreNatal(null);
            questionario.setGestanteGravidezMenorVinteAnos(null);
        }

        if (questionario.getPuerperio() != null && questionario.getPuerperio() == false) {
            questionario.setPuerperioExclusivo(null);
            questionario.setPuerperioMisto(null);
            questionario.setPuerperioRNPeso(null);
        }

        if (questionario.getPccu() != null && questionario.getPccu() == false) {
            questionario.setPccuFazAnualmente(null);
            questionario.setPccuQuantoTempo(null);
        }

        if (questionario.getFumante() != null && questionario.getFumante() == false) {
            questionario.setFumanteQuantoTempo(null);
        }

        if (questionario.getDependenteAlcoolico() != null && questionario.getDependenteAlcoolico() == false) {
            questionario.setDependenteAlcoolicoQuantoTempo(null);
        }

        if (questionario.getHipertensao() != null && questionario.getHipertensao() == false) {
            questionario.setHipertensaoUsaMedicamento(null);
            questionario.setHipertensaoNomeMedicamento(null);
        }

        if (questionario.getDiabetes() != null && questionario.getDiabetes() == false) {
            questionario.setDiabetesUsaMedicamento(null);
            questionario.setDiabetesHospitalizacaoPorComplicacao(null);
            questionario.setDiabetesNomeMedicamento(null);
        }

        if (questionario.getPossuiDoencaCardiaca() != null && questionario.getPossuiDoencaCardiaca() == false) {
            questionario.setDoencaCardiaca(null);
        }

        if (questionario.getPossuiProblemaRenal() != null && questionario.getPossuiProblemaRenal() == false) {
            questionario.setProblemaRenal(null);
            questionario.setProblemaRenalNomeMedicacao(null);
            questionario.setProblemaRenalQuantoTempo(null);
        }

        if (questionario.getPossuiDoencaPulmonar() != null && questionario.getPossuiDoencaPulmonar() == false) {
            questionario.setDoencaPulmonar(null);
            questionario.setDoencaPulmonarNomeMedicacao(null);
            questionario.setDoencaPulmonarQuantoTempo(null);
        }

        if (questionario.getHanseniase() != null && questionario.getHanseniase() == false) {
            questionario.setHanseniaseCurado(null);
            questionario.setHanseniaseEmTratamento(null);
        }

        if (questionario.getTuberculose() != null && questionario.getTuberculose() == false) {
            questionario.setTuberculoseCurado(null);
            questionario.setTuberculoseEmTratamento(null);
        }

        if (questionario.getCancer() != null && questionario.getCancer() == false) {
            questionario.setCancerCurado(null);
            questionario.setCancerEmTratamento(null);
            questionario.setCancerNome(null);
            questionario.setCancerNomeMedicamento(null);
            questionario.setCancerQuantoTempo(null);
        } else {
            if (questionario.getCancerEmTratamento() != null && questionario.getCancerEmTratamento() == false) {
                questionario.setCancerNomeMedicamento(null);
            } else {
                questionario.setCancerCurado(false);
            }
        }

        if (questionario.getDstsAids() != null && questionario.getDstsAids() == false) {
            questionario.setDstsAidsCurado(null);
            questionario.setDstsAidsEmTratamento(null);
            questionario.setDstsAidsNome(null);
            questionario.setDstsAidsNomeMedicamento(null);
        } else {
            if (questionario.getDstsAidsEmTratamento() != null && questionario.getDstsAidsEmTratamento() == false) {
                questionario.setDstsAidsNomeMedicamento(null);
            } else {
                questionario.setDstsAidsCurado(false);
            }
        }

        if (questionario.getInternadoRecentemente() != null && questionario.getInternadoRecentemente() == false) {
            questionario.setCausaInternacaoRecente(null);
        }

        if (questionario.getAcamado() != null && questionario.getAcamado() == false) {
            questionario.setAcamadoMotivo(null);
            questionario.setAcamadoQuantoTempo(null);
        }

        if (questionario.getUsaPlantasMedicinais() != null && questionario.getUsaPlantasMedicinais() == false) {
            questionario.setNomePlantasMedicinais(null);
        }

        if (questionario.getOutrasPraticasIntegrativas() != null && questionario.getOutrasPraticasIntegrativas() == false) {
            questionario.setOutrasPraticasIntegrativasNome(null);
        }

        if (questionario.getOutrasCondicoesSaude() != null && questionario.getOutrasCondicoesSaude().isEmpty()) {
            questionario.setOutrasCondicoesSaude(null);
        }

        if (questionario.getAcessoHigienePessoal() != null && questionario.getAcessoHigienePessoal() == false) {
            questionario.setHigienePessoal(null);
        }

        if (questionario.getCriancaVacinada() != null && questionario.getCriancaVacinada()) {
            questionario.setCriancaVacinasAtrasadas(null);
        }

        return true;
    }

    private void iniciarProfissional() {
        cadastro.setProfissional(new Profissional());
        cadastro.getProfissional().setMicroArea(new MicroArea());
    }

    private void iniciarResponsavelFamiliar() {
        cadastro.setCartaoResponsavelFamiliar(new Cidadao());
        cadastro.getCartaoResponsavelFamiliar().setMunicipioNascimento(new Cidade());
    }

    public void limparResponsavelDialog() {
        responsavelPesquisar = new Cidadao();
        responsaveis = new ArrayList<Cidadao>();
    }

    public void limparProfissionalDialog() {
        profissionalPesquisar = new Profissional();
        profissionalCadastrar = new Profissional();
        profissionaisPesquisar = new ArrayList<Profissional>();
    }
}
